package com.resume.aipeople.service.ai.asr;

import org.springframework.web.multipart.MultipartFile;
import reactor.core.publisher.Mono;

/**
 * 语音识别策略接口
 * 使用策略设计模式支持多种语音识别服务提供商
 */
public interface SpeechRecognitionStrategy {
    
    /**
     * 获取策略名称
     * @return 策略名称（如：baidu、aliyun）
     */
    String getStrategyName();
    
    /**
     * 获取策略显示名称
     * @return 用于前端显示的名称
     */
    String getDisplayName();
    
    /**
     * 检查策略是否可用
     * @return 是否可用
     */
    boolean isAvailable();
    
    /**
     * 语音转文字
     * @param audioFile 音频文件
     * @return 识别结果文本
     */
    Mono<String> speechToText(MultipartFile audioFile);
    
    /**
     * 检测音频格式
     * @param audioFile 音频文件
     * @return 音频格式
     */
    default String detectAudioFormat(MultipartFile audioFile) {
        try {
            byte[] audioData = audioFile.getBytes();
            String filename = audioFile.getOriginalFilename();
            String contentType = audioFile.getContentType();
            
            // 优先根据Content-Type判断
            if (contentType != null) {
                if (contentType.contains("webm")) {
                    return "pcm";
                }
                if (contentType.contains("wav")) {
                    return "wav";
                }
                if (contentType.contains("amr")) {
                    return "amr";
                }
                if (contentType.contains("ogg") || contentType.contains("mp4") || 
                    contentType.contains("m4a") || contentType.contains("opus")) {
                    return "pcm";
                }
            }
            
            // 检查文件头
            if (audioData.length >= 12) {
                // WAV格式检查
                if (audioData[0] == 'R' && audioData[1] == 'I' && audioData[2] == 'F' && audioData[3] == 'F' &&
                    audioData[8] == 'W' && audioData[9] == 'A' && audioData[10] == 'V' && audioData[11] == 'E') {
                    return "wav";
                }
                
                // AMR格式检查
                if (audioData[0] == '#' && audioData[1] == '!' && audioData[2] == 'A' && 
                    audioData[3] == 'M' && audioData[4] == 'R') {
                    return "amr";
                }
                
                // WebM格式检查
                if (audioData[0] == 0x1A && audioData[1] == 0x45 && audioData[2] == (byte)0xDF && audioData[3] == (byte)0xA3) {
                    return "pcm";
                }
            }
            
            // 根据文件名判断
            if (filename != null) {
                String ext = filename.toLowerCase();
                if (ext.endsWith(".wav") && (contentType == null || !contentType.contains("webm"))) {
                    return "wav";
                } else if (ext.endsWith(".amr")) {
                    return "amr";
                } else if (ext.endsWith(".pcm")) {
                    return "pcm";
                }
            }
            
            // 默认PCM格式
            return "pcm";
            
        } catch (Exception e) {
            return "pcm";
        }
    }
    
    /**
     * 检测采样率
     * @param audioData 音频数据
     * @param format 音频格式
     * @return 采样率
     */
    default int detectSampleRate(byte[] audioData, String format) {
        if ("wav".equals(format) && audioData.length >= 28) {
            try {
                // 验证WAV文件头
                if (audioData[0] == 'R' && audioData[1] == 'I' && audioData[2] == 'F' && audioData[3] == 'F' &&
                    audioData[8] == 'W' && audioData[9] == 'A' && audioData[10] == 'V' && audioData[11] == 'E') {
                    
                    // 读取采样率（小端序）
                    int sampleRate = (audioData[24] & 0xFF) | 
                                   ((audioData[25] & 0xFF) << 8) | 
                                   ((audioData[26] & 0xFF) << 16) | 
                                   ((audioData[27] & 0xFF) << 24);
                    
                    if (sampleRate == 16000 || sampleRate == 8000) {
                        return sampleRate;
                    }
                }
            } catch (Exception e) {
                // 忽略异常
            }
        }
        
        // 默认16000Hz
        return 16000;
    }
}



